package session

import (
	"Video-go/api/dbops"
	"Video-go/api/defs"
	"Video-go/api/utils"
	"sync"
	"time"
)

/* session 相关逻辑处理 */

// 线程安全
var sessionMap *sync.Map

func init() {
	// 初始化
	sessionMap = &sync.Map{}
}

func nowInMilli() int64 {
	return time.Now().UnixNano() / 1000000
}

// 过期删除session
func deleteSession(sid string) {
	sessionMap.Delete(sid)
	dbops.DeleteSession(sid)
}

// LoadSessionFromDB 从数据库加载sesion
func LoadSessionFromDB() {
	r, err := dbops.ReterieveAllSessions() // 获取所有session
	if err != nil {
		return
	}
	// 将整个数据写入map
	r.Range(func(k, v interface{}) bool {
		ss := v.(*defs.SimpleSession)
		sessionMap.Store(k, ss)
		return true
	})
}

// GenerateNewSessionId 生成新的session
func GenerateNewSessionId(un string) string {
	id, _ := utils.NewUUID()
	ct := nowInMilli()
	ttl := ct + 30*60*1000 // 过期时间
	ss := &defs.SimpleSession{Username: un, TTL: ttl}
	sessionMap.Store(id, ss)
	dbops.InsertSession(id, ttl, un)
	return id
}

// IsSessionExpired session是否过期
func IsSessionExpired(sid string) (string, bool) {
	ss, ok := sessionMap.Load(sid)
	ct := nowInMilli()
	if ok {
		if ss.(*defs.SimpleSession).TTL < ct {
			// 过期删除
			deleteSession(sid)
			return "", true
		}
		return ss.(*defs.SimpleSession).Username, false
	}
	return "", true
}
